home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 25 / AACD 25.iso / AACD / Magazine / Online / QMail / source / qmail-rspawn.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-15  |  1.8 KB  |  104 lines

  1. #include "fd.h"
  2. #include "wait.h"
  3. #include "substdio.h"
  4. #include "exit.h"
  5. #include "fork.h"
  6. #include "error.h"
  7. #include "tcpto.h"
  8.  
  9. void initialize(argc,argv)
  10. int argc;
  11. char **argv;
  12. {
  13.  tcpto_clean();
  14. }
  15.  
  16. int truncreport = 0;
  17.  
  18. void report(ss,wstat,s,len)
  19. substdio *ss;
  20. int wstat;
  21. char *s;
  22. int len;
  23. {
  24.  int j;
  25.  int k;
  26.  int result;
  27.  int orr;
  28.  
  29.  if (wait_crashed(wstat))
  30.   { substdio_puts(ss,"Zqmail-remote crashed.\n"); return; }
  31.  switch(wait_exitcode(wstat))
  32.   {
  33.    case 0: break;
  34.    case 111: substdio_puts(ss,"ZUnable to run qmail-remote.\n"); return;
  35.    default: substdio_puts(ss,"DUnable to run qmail-remote.\n"); return;
  36.   }
  37.  if (!len)
  38.   { substdio_puts(ss,"Zqmail-remote produced no output.\n"); return; }
  39.  
  40.  result = -1;
  41.  j = 0;
  42.  for (k = 0;k < len;++k)
  43.    if (!s[k])
  44.     {
  45.      if (s[j] == 'K') { result = 1; break; }
  46.      if (s[j] == 'Z') { result = 0; break; }
  47.      if (s[j] == 'D') break;
  48.      j = k + 1;
  49.     }
  50.  
  51.  orr = result;
  52.  switch(s[0])
  53.   {
  54.    case 's': orr = 0; break;
  55.    case 'h': orr = -1;
  56.   }
  57.  
  58.  switch(orr)
  59.   {
  60.    case 1: substdio_put(ss,"K",1); break;
  61.    case 0: substdio_put(ss,"Z",1); break;
  62.    case -1: substdio_put(ss,"D",1); break;
  63.   }
  64.  
  65.  for (k = 1;k < len;)
  66.    if (!s[k++])
  67.     {
  68.      substdio_puts(ss,s + 1);
  69.      if (result <= orr)
  70.        if (k < len)
  71.      switch(s[k])
  72.       {
  73.        case 'Z': case 'D': case 'K':
  74.              substdio_puts(ss,s + k + 1);
  75.       }
  76.      break;
  77.     }
  78. }
  79.  
  80. int spawn(fdmess,fdout,s,r,at)
  81. int fdmess; int fdout;
  82. char *s; char *r; int at;
  83. {
  84.  int f;
  85.  char *(args[5]);
  86.  
  87.  args[0] = "qmail-remote";
  88.  args[1] = r + at + 1;
  89.  args[2] = s;
  90.  args[3] = r;
  91.  args[4] = 0;
  92.  
  93.  if (!(f = vfork()))
  94.   {
  95.    if (fd_move(0,fdmess) == -1) _exit(111);
  96.    if (fd_move(1,fdout) == -1) _exit(111);
  97.    if (fd_copy(2,1) == -1) _exit(111);
  98.    execvp(*args,args);
  99.    if (error_temp(errno)) _exit(111);
  100.    _exit(100);
  101.   }
  102.  return f;
  103. }
  104.